/**
 * 
 */
package com.study.singleton;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;

/**
 * 
 * 实现单例模式有4个步骤： 1) 静态私有属性 2) 私有构造方法 3) 公有的静态的获取实例的方法 4) 公有的业务方法
 * 
 * @author Administrator
 * @date 2019年6月24日
 */
// 懒汉式（线程不安全）  -- 序列化破解单例
public class SingletonV32 implements Serializable {

	private static SingletonV32 instance;
	private Person person;

	private SingletonV32() {
		person = new Person("xiaoming");
	};

	public synchronized static SingletonV32 getInstance() {  //增加synchronized保证线程安全，但效率很低

		if (instance == null) {  //可能多个线程执行了这步
			try {
				Thread.sleep(2000);
			} catch (Exception e) {
			}
			instance = new SingletonV32();
		}
		return instance;
	}

	// 4、公有业务方法
	public String getPersonName() {
		return person.getName();
	}

	class Person implements Serializable{
		private String name;

		public Person(String n) {
			this.name = n;
		}

		public String getName() {
			return name;
		}
	}
	
	//返回序列化获取对象 ，保证为单例
	public Object readResolve() {
	    return instance;
	}

	public static void main(String[] args) throws Exception {
		
		// 1. 使用懒汉式创建对象
		SingletonV32 instance1 = SingletonV32.getInstance();
		// 2. 使用Java反射技术初始化对象 执行无参构造函数
		FileOutputStream fos = new FileOutputStream("d:\\logs\\Singleton.obj");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(instance1);
		oos.flush();
		oos.close();

		FileInputStream fis = new FileInputStream("d:\\logs\\Singleton.obj");
		ObjectInputStream ois = new ObjectInputStream(fis);
		SingletonV32 instance2 = (SingletonV32) ois.readObject();
		System.out.println(instance1 == instance2);  //注释61行，结果会不一致

		
		System.out.println(SingletonV32.getInstance().getPersonName());
	}
}
